﻿//
//
// 版权所有 (c) 2021-2023 JR  
//
// 特此免费授予获得本软件的任何人以处理本软件的权利，但须遵守以下条件：在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他责任负责，无论是因合同、侵权或其他方式引起的，与软件或其使用或其他交易有关。

using FluentEmail.Core;
using Furion.ClayObject;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using RazorEngine.Compilation.ImpromptuInterface.Dynamic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EMC.VISITOR.Core;
public static class TypeHelper
{
    public static Dictionary<string, SugarColumn> GetCustomSugarColumns(string typeName)
    {
        Dictionary<string, SugarColumn> dic = new Dictionary<string, SugarColumn>();
        var type = App.EffectiveTypes.Where(u => u.Name == typeName && !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)).FirstOrDefault();
        if (type == null)
            return default(Dictionary<string, SugarColumn>);
        System.Reflection.PropertyInfo[] properties = type.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
        properties.ForEach(c =>
        {
            var column = c.GetCustomAttribute<SugarColumn>();
            if (!c.PropertyType.FullName.Contains(typeof(long).FullName))
                dic.Add(c.Name.ToLower(), column);
        });
        return dic;
    }

    public static dynamic SetDynamicZh(string typeName, dynamic clay)
    {
        var columns = GetCustomSugarColumns(typeName);
        dynamic newClay = Clay.Object(new { });
        foreach (KeyValuePair<string, dynamic> item in clay)
        {
            //if (!columns.Any(r => r.Key == item.Key))
            //    newClay[item.Key] = item.Value;
            //else
            //    newClay[columns[item.Key].ColumnDescription] = item.Value;

            if (columns != null && columns.Any(r => r.Key.ToLower() == item.Key.ToLower()))
                newClay[columns[item.Key.ToLower()].ColumnDescription] = item.Value;
        }
        return newClay;
    }
}

